package main

import (
	"gogo"
	"log"
	"net/http"
)

func main() {
	// 创建路由处理器
	router := gogo.NewHttpRouterHandler()

	// ===================
	// 默认主机的基本功能
	// ===================
	router.RegHTTPProcFunc("GET", "/hello", func(ctx *gogo.HTTPContext) {
		ctx.WriteString("Hello, World!")
	})

	// 默认主机的转发规则
	// 访问 /find 会被转发到 http://192.168.1.21:3009/_search
	router.RegHTTPForward("GET", "/find", "http://192.168.1.21:3009/_search")

	// ===================
	// 演示主机名路由转发 (proxy.localhost)
	// ===================

	// API代理 - 将API请求转发到后端服务
	router.RegHTTPForwardWithHost("proxy.localhost", "GET", "/api", "http://jsonplaceholder.typicode.com")
	router.RegHTTPForwardWithHost("proxy.localhost", "POST", "/api", "http://jsonplaceholder.typicode.com")

	// 静态资源代理 - 转发到CDN
	router.RegHTTPForwardWithHost("proxy.localhost", "GET", "/static", "https://cdn.jsdelivr.net/npm")

	// 搜索服务代理
	router.RegHTTPForwardWithHost("proxy.localhost", "GET", "/search", "http://192.168.1.21:3009/_search")

	// 代理服务主页
	router.RegHTTPProcFuncWithHost("proxy.localhost", "GET", "/", func(ctx *gogo.HTTPContext) {
		ctx.WriteString(`
<!DOCTYPE html>
<html>
<head>
    <title>代理服务 - 主机名路由转发示例</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; background: #f0f8ff; }
        .proxy-info { background: white; padding: 30px; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
        .forward-rule { background: #e8f5e8; padding: 15px; margin: 10px 0; border-radius: 5px; border-left: 4px solid #4CAF50; }
        .test-links { background: #fff3cd; padding: 15px; border-radius: 5px; margin: 20px 0; }
    </style>
</head>
<body>
    <div class="proxy-info">
        <h1>🔀 代理服务</h1>
        <p>当前主机: <strong>` + ctx.GetRequest().Host + `</strong></p>
        <p>这是专门的代理服务域名，展示了基于主机名的转发功能。</p>
        
        <h2>🛣️ 转发规则：</h2>
        
        <div class="forward-rule">
            <strong>API代理:</strong><br>
            <code>` + ctx.GetRequest().Host + `/api/*</code> → <code>jsonplaceholder.typicode.com/*</code>
        </div>
        
        <div class="forward-rule">
            <strong>静态资源代理:</strong><br>
            <code>` + ctx.GetRequest().Host + `/static/*</code> → <code>cdn.jsdelivr.net/npm/*</code>
        </div>
        
        <div class="forward-rule">
            <strong>搜索服务代理:</strong><br>
            <code>` + ctx.GetRequest().Host + `/search/*</code> → <code>192.168.1.21:3009/_search/*</code>
        </div>
        
        <div class="test-links">
            <h3>🧪 测试链接：</h3>
            <ul>
                <li><a href="/api/posts/1" target="_blank">API测试 - 获取文章</a></li>
                <li><a href="/api/users/1" target="_blank">API测试 - 获取用户</a></li>
                <li><a href="/static/bootstrap@5.1.0/dist/css/bootstrap.min.css" target="_blank">静态资源测试 - Bootstrap CSS</a></li>
            </ul>
            
            <p><strong>注意：</strong> 请确保配置了hosts文件：<code>127.0.0.1 proxy.localhost</code></p>
        </div>
    </div>
</body>
</html>`)
	})

	// ===================
	// 负载均衡示例 (lb.localhost)
	// ===================

	// 模拟负载均衡到不同的后端服务器
	router.RegHTTPProcFuncWithHost("lb.localhost", "GET", "/", func(ctx *gogo.HTTPContext) {
		ctx.WriteString(`
<!DOCTYPE html>
<html>
<head>
    <title>负载均衡示例</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; background: #f5f5f5; }
        .lb-panel { background: white; padding: 30px; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
        .server { background: #e3f2fd; padding: 15px; margin: 10px; border-radius: 8px; display: inline-block; width: 200px; }
    </style>
</head>
<body>
    <div class="lb-panel">
        <h1>⚖️ 负载均衡</h1>
        <p>主机: <strong>` + ctx.GetRequest().Host + `</strong></p>
        <p>这个示例展示了如何为特定主机配置不同的转发规则。</p>
        
        <h2>🖥️ 后端服务器集群：</h2>
        <div class="server">
            <h4>🟢 服务器 A</h4>
            <p>192.168.1.10:8080</p>
            <p>状态: 在线</p>
        </div>
        <div class="server">
            <h4>🟢 服务器 B</h4>
            <p>192.168.1.11:8080</p>
            <p>状态: 在线</p>
        </div>
        <div class="server">
            <h4>🔴 服务器 C</h4>
            <p>192.168.1.12:8080</p>
            <p>状态: 离线</p>
        </div>
        
        <p><a href="/service1">测试服务1转发</a> | <a href="/service2">测试服务2转发</a></p>
    </div>
</body>
</html>`)
	})

	// 为负载均衡域名配置不同的转发规则
	router.RegHTTPForwardWithHost("lb.localhost", "GET", "/service1", "http://192.168.1.10:8080/api")
	router.RegHTTPForwardWithHost("lb.localhost", "GET", "/service2", "http://192.168.1.11:8080/api")

	// ===================
	// 错误处理页面
	// ===================

	// 默认404页面
	router.RegHTTPStatusFunc(http.StatusNotFound, func(ctx *gogo.HTTPContext) {
		ctx.WriteHeaderStatus(http.StatusNotFound)
		ctx.WriteString(`
<!DOCTYPE html>
<html>
<head>
    <title>页面未找到</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; text-align: center; }
        .error { background: #fff3cd; padding: 40px; border-radius: 10px; border: 1px solid #ffeaa7; }
    </style>
</head>
<body>
    <div class="error">
        <h1>🔍 404 - 页面未找到</h1>
        <p>主机: ` + ctx.GetRequest().Host + `</p>
        <p>路径: ` + ctx.GetRequest().URL.Path + `</p>
        <a href="/">返回首页</a>
    </div>
</body>
</html>`)
	})

	// 代理域名专用404页面
	router.RegHTTPStatusFuncWithHost("proxy.localhost", http.StatusNotFound, func(ctx *gogo.HTTPContext) {
		ctx.WriteHeaderStatus(http.StatusNotFound)
		ctx.WriteString(`
<!DOCTYPE html>
<html>
<head>
    <title>代理服务 - 页面未找到</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; text-align: center; }
        .proxy-error { background: #ffebee; padding: 40px; border-radius: 10px; color: #c62828; }
    </style>
</head>
<body>
    <div class="proxy-error">
        <h1>🚫 代理服务 - 404</h1>
        <p>无法在代理配置中找到匹配的转发规则</p>
        <p>主机: ` + ctx.GetRequest().Host + `</p>
        <p>路径: ` + ctx.GetRequest().URL.Path + `</p>
        <a href="/">查看可用的代理规则</a>
    </div>
</body>
</html>`)
	})

	// 启动服务
	log.Println("🚀 增强的转发服务示例启动中...")
	log.Println("📍 请访问: http://localhost:3009")
	log.Println("🔧 配置hosts文件测试不同域名转发:")
	log.Println("   127.0.0.1 proxy.localhost")
	log.Println("   127.0.0.1 lb.localhost")
	log.Println()
	log.Println("🌐 测试URL:")
	log.Println("   http://localhost:3009/ (默认主机)")
	log.Println("   http://proxy.localhost:3009/ (代理服务)")
	log.Println("   http://lb.localhost:3009/ (负载均衡)")

	// 使用自定义路由处理器启动服务
	server := &http.Server{
		Addr: ":3009",
	}
	server.Handler = router
	if err := server.ListenAndServe(); err != nil {
		log.Fatalf("启动http服务失败: %v", err)
	}
}
